package gsw.demo.mvp.core.net.service;

import java.util.Map;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * 发送请求的Service：这里用来发送所有的请求
 */
public interface RestService {

    @GET
    Call<String> get(@Url String url, @QueryMap Map<String, Object> params);

    /**
     * post请求：使用form格式的数据
     * 使用@FormUrlEncoded 指定form格式的数据
     *
     * @param url    请求路径
     * @param params 请求参数
     */
    @FormUrlEncoded
    @POST
    Call<String> post(@Url String url, @FieldMap Map<String, Object> params);

    @FormUrlEncoded
    @PUT
    Call<String> put(@Url String url, @FieldMap Map<String, Object> params);

    @DELETE
    Call<String> delete(@Url String url, @QueryMap Map<String, Object> params);

    /**
     * 文件下载请求
     * 默认会将下载的数据，直接保存到内存中。使用@Streaming，将下载的数据保存到文件中
     *
     * @param url    请求路径
     * @param params 请求参数
     */
    @Streaming
    @GET
    Call<ResponseBody> download(@Url String url, @QueryMap Map<String, Object> params);

    /**
     * 文件上传
     */
    @Multipart
    @POST
    Call<String> upload(@Url String url, @Part MultipartBody.Part file);

    /**
     * post请求：使用原始数据。请求参数需要使用RequestBody
     *
     * @param url  请求路径
     * @param body 请求体
     * @return
     */
    @POST
    Call<String> postRaw(@Url String url, @Body RequestBody body);


    /**
     * put请求：使用原始数据。请求参数需要使用RequestBody
     *
     * @param url  请求路径
     * @param body 请求体
     */
    @PUT
    Call<String> putRaw(@Url String url, @Body RequestBody body);
}










